home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 42
/
Amiga Format AFCD42 (Issue 126, Aug 1999).iso
/
-serious-
/
misc
/
identify
/
identify_dev
/
examples
/
expansionmui.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-05-14
|
8KB
|
224 lines
/*********************************************************************
** **
** E X P A N S I O N M U I **
** **
** A small example for implementing identify in MUI applications. **
** Compiles with SAS/C. On other C compilers, some small modifica- **
** tions will be required regarding the __asm interface. See the **
** manual of your C compiler for further details. **
** **
*********************************************************************/
/*
** (C) 1997 by Richard Körber -- All Rights Reserved
*/
#include <clib/alib_protos.h>
#include <clib/exec_protos.h>
#include <clib/expansion_protos.h>
#include <clib/muimaster_protos.h>
#include <clib/identify_protos.h>
#include <pragmas/exec_pragmas.h>
#include <pragmas/expansion_pragmas.h>
#include <pragmas/muimaster_pragmas.h>
#include <pragmas/identify_pragmas.h>
#include <stdio.h>
#include <string.h>
#include <exec/memory.h>
#include <libraries/identify.h>
#include <libraries/mui.h>
#include <libraries/configregs.h>
#include <libraries/configvars.h>
#define MAKE_ID(a,b,c,d) \
((ULONG) (a)<<24 | (ULONG) (b)<<16 | (ULONG) (c)<<8 | (ULONG) (d))
struct Library *MUIMasterBase; // Library bases
struct Library *ExpansionBase;
struct Library *IdentifyBase;
/*------------------------------------------------------------------**
** ConstructFunc -- Expansion list constructor hook
*/
__saveds __asm APTR ConstructFunc
(
register __a1 struct ConfigDev *cd
)
{
struct ConfigDev *newcd;
newcd = AllocVec(sizeof(struct ConfigDev),MEMF_PUBLIC);
if(newcd)
CopyMem(cd,newcd,sizeof(struct ConfigDev));
return(newcd);
}
/*------------------------------------------------------------------**
** DisplayFunc -- Expansion list display hook
*/
__saveds __asm LONG DisplayFunc
(
register __a2 char **array,
register __a1 struct ConfigDev *cd
)
{
static char buf_nr[5];
static char buf_address[12];
static char buf_size[6];
static char buf_id[10];
static char buf_manuf[IDENTIFYBUFLEN];
static char buf_product[IDENTIFYBUFLEN];
static char buf_class[IDENTIFYBUFLEN];
if(cd) // Show the contents
{
ULONG size = cd->cd_BoardSize>>10;
ULONG unit = 'K';
if(size>=1024)
{
unit = 'M';
size >>= 10;
}
sprintf(buf_nr,"%ld",array[-1]+1); // Get the entry number
sprintf(buf_address,"%08lx",cd->cd_BoardAddr); // board address
sprintf(buf_size,"%3ld%lc",size,unit); // board size
sprintf(buf_id,"%04lx:%02lx",cd->cd_Rom.er_Manufacturer,cd->cd_Rom.er_Product);
IdExpansionTags( // Identify the expansion board
IDTAG_ConfigDev, cd,
IDTAG_ManufStr , buf_manuf,
IDTAG_ProdStr , buf_product,
IDTAG_ClassStr , buf_class,
TAG_DONE
);
*array++ = buf_nr;
*array++ = buf_address;
*array++ = buf_size;
*array++ = buf_id;
*array++ = buf_manuf;
*array++ = buf_product;
*array = buf_class;
}
else // Show the title line
{
*array++ = "\33b\33cNr.";
*array++ = "\33b\33cAddress";
*array++ = "\33b\33cSize";
*array++ = "\33b\33cID";
*array++ = "\33b\33cManufacturer";
*array++ = "\33b\33cProduct";
*array = "\33b\33cClass";
}
return(0);
}
/*------------------------------------------------------------------**
** DestructFunc -- Expansion list destructor hook
*/
__saveds __asm void DestructFunc
(
register __a1 struct ConfigDev *cd
)
{
if(cd) FreeVec(cd);
}
/*------------------------------------------------------------------**
** main -- MAIN PART
*/
int main(void)
{
ULONG sigs=0; // Signal bits
const struct Hook ConstructHook = {{NULL,NULL},(void *)ConstructFunc,NULL,NULL};
const struct Hook DisplayHook = {{NULL,NULL},(void *)DisplayFunc ,NULL,NULL};
const struct Hook DestructHook = {{NULL,NULL},(void *)DestructFunc ,NULL,NULL};
Object *app; // Application object
Object *window; // Window object
Object *LV_explist; // Expansion listview object
struct ConfigDev *cd = NULL; // ConfigDev traverse pointer
if(IdentifyBase = OpenLibrary("identify.library",5))
{
if(ExpansionBase = OpenLibrary("expansion.library",36))
{
if(MUIMasterBase = OpenLibrary("muimaster.library",11))
{
app = ApplicationObject, // Create the application
MUIA_Application_Title , "Expansions",
MUIA_Application_Version , "$VER: Expansions V1.1 (16.4.97)",
MUIA_Application_Copyright , "© 1997 by Richard Körber",
MUIA_Application_Author , "Richard Körber",
MUIA_Application_Description , "A small identify.library example",
MUIA_Application_Base , "EXPANSIONS",
MUIA_Application_Window , window = WindowObject,
MUIA_Window_Title , "Expansions Demo",
MUIA_Window_ID , MAKE_ID('E','X','P','D'),
WindowContents, VGroup,
Child, TextObject,
MUIA_Frame , MUIV_Frame_Text,
MUIA_Background , MUII_TextBack,
MUIA_Text_Contents, "\33cA small example how to use\nidentify.library with MUI.",
End,
Child, LV_explist = ListviewObject,
MUIA_Listview_Input , FALSE,
MUIA_Listview_List , ListObject,
MUIA_Frame , MUIV_Frame_ReadList,
MUIA_List_ConstructHook , &ConstructHook,
MUIA_List_DisplayHook , &DisplayHook,
MUIA_List_DestructHook , &DestructHook,
MUIA_List_Title , TRUE,
MUIA_List_Format , "P=\33r BAR,,P=\33r,BAR,D=6,P=\33c D=6,P=\33r",
End,
End,
Child, TextObject,
MUIA_Frame , MUIV_Frame_Text,
MUIA_Background , MUII_TextBack,
MUIA_Text_Contents, "\33cPlease send the description of all unknown boards\nto Richard Körber <shred@chessy.aworld.de>!",
End,
End,
End,
End;
if(app)
{
// Close gadget notification
DoMethod(window,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,
app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit);
// Fill the expansion list
set(LV_explist,MUIA_List_Quiet,TRUE); // Do a quick update
while(cd = FindConfigDev(cd,-1,-1))
{
DoMethod(LV_explist,MUIM_List_InsertSingle,cd,MUIV_List_Insert_Bottom);
}
set(LV_explist,MUIA_List_Quiet,FALSE); // Now, display the list
set(window,MUIA_Window_Open,TRUE);
// Main Loop
while(DoMethod(app,MUIM_Application_NewInput,&sigs) != MUIV_Application_ReturnID_Quit)
{
if(sigs) // Wait for MUI signals to occur
{
sigs = Wait(sigs | SIGBREAKF_CTRL_C);
if(sigs & SIGBREAKF_CTRL_C) break; // Aborted
}
}
MUI_DisposeObject(app); // dispose the application
}
CloseLibrary(MUIMasterBase);
}
CloseLibrary(ExpansionBase);
}
CloseLibrary(IdentifyBase);
}
return 0; // return code 0
}
/********************************************************************/